/**
 * 完全模仿书本的例子
 * 
 * 运行示例 
 * cargo run 宋 E:\learning\gitee\rust-org\test-1\minigrep\src\古诗.txt  -- ok
 * cargo run 宋 古诗.txt  -- ok
 * cargo run 宋   -- 错误，因为参数太少了
 */
use std::env;
use mmsearch::{config,search};

enum Games{
    战斗,战旗
}

fn main() {
    let me=Box::new(String::from("中国"));
    let f=Games::战斗;
    //1.0 args() 返回的字符是unicode编码的 ,args()本身返回迭代器,collect()方法将迭代器中的元素收集到Vec<String>中                                                                           
    let args: Vec<String> = env::args().collect();

    //2.0 解析参数,并构建配置
    // unwrap_or_else()方法,如果Config::build(&args)返回Ok(config),则执行闭包中的内容,否则执行|err|{...}中的内容
    let con=config::build(&args).unwrap_or_else(|err|{
        eprintln!("程序异常:{}",err);
        std::process::exit(1);
    });    

    if con.show_help {
        config::show_help();
        std::process::exit(0);
    }
    
    println!("配置信息:{:?}",&con);

    //3.0 根据配置查找文件，并打印查找到的结果
    //如果文件比较小，那么就直接在内存处理;否则直接在search中逐行处理
    if config::is_too_big(&con.file_name){
        print!("正在查找大文件...");
       let result= search::searh_big_file(&con.file_name,&con.target);
       match result{
        Ok(_)=>println!("查找完成!"),
        Err(e)=>println!("读取文件失败: {:?}", e)
       }
    }
    else{
        print!("正在查找小文件...");
        let result=search::search_small_file(&con);
        for line in result.iter() {
            println!("{}",line);
        }
    }
}